import Vue from 'vue'
import VueRouter from 'vue-router'
import routes from './routes'
import store from '@/store'

Vue.use(VueRouter)

// 解决编程式导航 $router.push() 重复跳转的问题
const originPush = VueRouter.prototype.push
VueRouter.prototype.push = function (location) {
  originPush.call(this,location).catch(() => {})
}
const originReplace = VueRouter.prototype.replace


VueRouter.prototype.replace = function (location) {
  originReplace.call(this,location).catch(() => {})
}

const router = new VueRouter({
  routes,
  //滚动行为-控制页面滚动到什么位置
  scrollBehavior (to, from, savedPosition) {
    return { y: 0 }
  },

})


router.beforeEach(async function (to, from, next) {

  //拿到store中的token
  let token = store.state.user.token
  if (token) { //有token，代表登录

    //判断有无个人信息，有登录，无获取
    let username = store.state.user.userInfo.username
    if (username) {
      next() //如果有个人信息，跳转到首页header组件会自己展示，直接放行就行
    } else {
      //没个人信息需要重新获取个人信息

      try {
        await store.dispatch('user/getUserInfo')
        // 正常await没有报错，证明接口调用成功
        next()  //获取成功放行
      } catch (error) { 
        //请求失败，证明个人信息没有获取到，什么情况下会进catch？
        // 1.网断了
        // 2.token错误 --模拟token失效
        // next('/login') 不能直接去/login,为啥？ 会死循环？

        // token错误的(失效的)获取个人信息失败，走catch
        // 走catch又去走路由守卫
        // 进入路由守卫后，拿token，拿到的是错误的token
        // 判断有没有个人信息，没有个人信息，获取个人信息
        // 拿着token错误的(失效的)发请求获取个人信息

        // token错误的(失效的)获取个人信息失败，走catch
        // 走catch又去走路由守卫
        // 进入路由守卫后，拿token，拿到的是错误的token
        // 判断有没有个人信息，没有个人信息，获取个人信息
        // 拿着token错误的(失效的)发请求获取个人信息

        // token错误的(失效的)获取个人信息失败，走catch
        // 走catch又去走路由守卫
        // 进入路由守卫后，拿token，拿到的是错误的token
        // 判断有没有个人信息，没有个人信息，获取个人信息
        // 拿着token错误的(失效的)发请求获取个人信息

        // ...

        // 解决:
        // 直接把token清除掉，当下一次进入路由守卫的时候，先判断有没有token，没有，直接放行
        
        
        store.dispatch('user/clearToken')
        next('/login')
      }
    }
  } else { //没有token，代表没有登录


    let blackList = ['/trade','/pay','/paysuccess','/center']
    if (blackList.some(item => to.path.includes(item)) ) {
      alert('请先登录')
      next(`/login?redirect=${ to.path }`)
    } else {

      next()
    }
    // next('/login')
    //没有token不能直接去login，会循环，先放行，后续加条件
  }
  // next('/login') 不能直接跳转到login,因为url变化,只要路由变化就会重新走守卫,造成死循环


})


export default router

  